Ya hemos visto que las colas son casos particulares de listas abiertas, pero más simples. Como en los casos anteriores, veremos ahora un ejemplo de cola usando clases.
Para empezar, y como siempre, necesitaremos dos clases, una para nodo y otra para cola. Además la clase para nodo debe ser amiga de la clase cola, ya que ésta debe acceder a los miembros privados de nodo.
class nodo {
public:
nodo(int v, nodo *sig = NULL) {
valor = v;
siguiente = sig;
}
private:
int valor;
nodo *siguiente;
friend class cola;
};
typedef nodo *pnodo;
class cola {
public:
cola() : ultimo(NULL), primero(NULL) {}
~cola();
void Anadir(int v);
int Leer();
private:
pnodo primero, ultimo;
};
Los algoritmos para Anadir y Leer son los mismos que expusimos para el ejemplo C, tan sólo cambia el modo de crear y destruir nodos.
#include <iostream>
using namespace std;
class nodo {
public:
nodo(int v, nodo *sig = NULL) {
valor = v;
siguiente = sig;
}
private:
int valor;
nodo *siguiente;
friend class cola;
};
typedef nodo *pnodo;
class cola {
public:
cola() : ultimo(NULL), primero(NULL) {}
~cola();
void Push(int v);
int Pop();
private:
pnodo ultimo;
};
cola::~cola() {
while(primero) Leer();
}
void cola::Anadir(int v) {
pnodo nuevo;
/* Crear un nodo nuevo */
nuevo = new nodo(v);
/* Si la cola no estaba vacía, añadimos el nuevo a continuación de ultimo */
if(ultimo) ultimo->siguiente = nuevo;
/* Ahora, el último elemento de la cola es el nuevo nodo */
ultimo = nuevo;
/* Si primero es NULL, la cola estaba vacía, ahora primero apuntará también al nuevo nodo */
if(!primero) primero = nuevo;
}
int cola::Leer() {
pnodo nodo; /* variable auxiliar para manipular nodo */
int v; /* variable auxiliar para retorno */
/* Nodo apunta al primer elemento de la pila */
nodo = primero;
if(!nodo) return 0; /* Si no hay nodos en la pila retornamos 0 */
/* Asignamos a primero la dirección del segundo nodo */
primero = nodo->siguiente;
/* Guardamos el valor de retorno */
v = nodo->valor;
/* Borrar el nodo */
delete nodo;
/* Si la cola quedó vacía, ultimo debe ser NULL también*/
if(!primero) ultimo = NULL;
return v;
}
int main() {
cola Cola;
Cola.Anadir(20);
cout << "Añadir(20)" << endl;
Cola.Anadir(10);
cout << "Añadir(10)" << endl;
cout << "Leer: " << Cola.Leer() << endl;
Cola.Anadir(40);
cout << "Añadir(40)" << endl;
Cola.Anadir(30);
cout << "Añadir(30)" << endl;
cout << "Leer: " << Cola.Leer() << endl;
cout << "Leer: " << Cola.Leer() << endl;
Cola.Anadir(90);
cout << "Añadir(90)" << endl;
cout << "Leer: " << Cola.Leer() << endl;
cout << "Leer: " << Cola.Leer() << endl;
cin.get();
return 0;
}

© Julio de 2001 Salvador Pozo, salvador@conclase.net